////////////////////////////////////////////////////////////////////////////////

#include "server_network.h"

////////////////////////////////////////////////////////////////////////////////


ServerNetwork::ServerNetwork( ClientPackets& _recvQueue,
                              ServerPackets& _sendQueue,
                              Mutex& _sendQueueMutex,
                              Mutex& _recvQueueMutex,
                              const std::string& _sendPort,
                              const std::string& _recvPort )
: m_RecvQueue(_recvQueue),
  m_SendQueue(_sendQueue),
  m_RecvQueueMutex(_recvQueueMutex),
  m_SendQueueMutex(_sendQueueMutex),
  m_StartThread(NULL),
  m_SendPort(_sendPort),
  m_RecvPort(_recvPort)
{
}


////////////////////////////////////////////////////////////////////////////////


ServerNetwork::~ServerNetwork()
{
    if (m_StartThread)
        delete m_StartThread;
}


////////////////////////////////////////////////////////////////////////////////


void ServerNetwork::Start()
{
    if (!m_StartThread)
    {
        m_StartThread = new Thread(&ServerNetwork::StartThread, this);
    }
}


////////////////////////////////////////////////////////////////////////////////


void ServerNetwork::StartThread()
{
    boost::asio::io_service io_service;
    
    tcp::acceptor recvAcceptor(io_service, tcp::endpoint(tcp::v4(), 37015) );
    tcp::acceptor sendAcceptor(io_service, tcp::endpoint(tcp::v4(), 37016) );
    
    while (true)
    {
        ServerSession* newSession = new ServerSession( m_RecvQueue,
                                                       m_SendQueue,
                                                       m_RecvQueueMutex,
                                                       m_SendQueueMutex,
                                                       io_service );

        recvAcceptor.accept( newSession->GetRecvSocket() );
        sendAcceptor.accept( newSession->GetSendSocket() );

        m_Sessions.push_back(newSession);
        m_Sessions.back()->Start();
    }
}


////////////////////////////////////////////////////////////////////////////////
